package com.ruoyi.web.lambda;

/**
 * @Program: RuoYi-Vue-chy->PrinterDemo
 * @Description: 引用对象
 * @Author: hongyu.chen
 * @Date: 2025-03-07 21:10
 * @Version： 1.0
 **/
/*
定义一个类(PrintString)，里面定义一个方法
    publicvoid printUpper(Strg s):把字符串参数变成大写的数据，然后在控制台输出
定义一个接口(Printer)，里面定义一个抽象方法
    void printUpperCase(String s)
定义一个测试类(PrinterDemo)，在测试类中提供两个方法
    一个方法是:usePrinter(Printer p)
    一个方法是主方法，在主方法中调用usePrinter方法
 */
public class PrinterDemo {
    public static void main(String[] args) {
        //在主方法中调用usePrinter方法

        usePrinter(s -> {
//            String result = s.toUpperCase();
//            System.out.println(result);
            System.out.println(s.toUpperCase());
        });

        System.out.println("------------------------------11");
        usePrinter(s -> System.out.println(s.toUpperCase()));

        System.out.println("------------------------------22");
        PrintString ps = new PrintString();
        usePrinter(ps::printUpper);

        System.out.println("------------------------------33");
        usePrinter(s -> {
            System.out.println("usePrinter 的 s：" + s);
            ps.printUpper(s);
        });

        System.out.println("------------------------------44");
        usePrinter((new Printer() {
            @Override
            public void printUpperCase(String st) {
                System.out.println("printUpperCase 的 st：" + st);

                ps.printUpper(st);
            }
        }));

        System.out.println("------------------------------55");
        Printer printer = new Printer() {
            @Override
            public void printUpperCase(String st) {
                System.out.println("printUpperCase 的 st：" + st);

                ps.printUpper(st);
            }
        };

        //Lambda表达式被对象的实例方法替代的时候，它的形式参数全部传递给该方法作为参数
    }

    private static void usePrinter(Printer p){
        System.out.println("usePrinter");
        p.printUpperCase("Hello World1");
        p.printUpperCase("Hello World2");
    }
}
